home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 6
/
FM Towns Free Software Collection 6.iso
/
t_os
/
book
/
src
/
excmd.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-07-08
|
4KB
|
167 lines
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <egb.h>
#include <snd.h>
#include <mos.h>
#include <exec.cf>
#include <conio.h>
#include <msdos.cf>
#include "book.h"
#include "lib.h"
#include "menu.h"
#include "cons.h"
#include "keyio.h"
#include "mouse.h"
#include "snd.h"
#include "excmd.h"
EXCMD_t excmd[EXCMD_MAX];
int excmd_num = 0, excmd_len = 0;
/*
* 外部コマンドの登録テーブルを初期化する
*
* パラメータ: なし
* 戻り値: なし
*/
void excmd_init(void)
{
int i;
for (i = 0; i < excmd_num; i++)
free(excmd[i]._base);
excmd_num = excmd_len = 0;
}
/*
* 外部コマンドをテーブルに登録する
*
* パラメータ: コマンド情報
* 戻り値: なし
*/
void excmd_apend(char *cmd)
{
EXCMD_t *ep;
char *tmp;
int len;
if (excmd_num >= EXCMD_MAX || (tmp = strdup(cmd)) == NULL)
return;
(ep = &excmd[excmd_num++])->_base = tmp;
ep->name = skipbl(tmp);
tmp = skipwd(skipbl(skipwd(tmp))); /* 名前を飛び越える */
if (*tmp != '\0')
*tmp++ = '\0';
ep->path = skipbl(tmp);
tmp = skipwd(ep->path);
if (*tmp != '\0')
*tmp++ = '\0';
ep->param = skipbl(tmp);
if ((len = strlen(ep->name)) > excmd_len)
excmd_len = len;
}
/*
* 拡張コマンドの起動
*
* パラメータ: エントリの番号
* 戻り値:
* FALSE 指定のエントリが存在しない時
* TRUE 上記以外
*/
int exec_cmd(int num)
{
void (*func)();
EXCMD_t *ep;
char param[130];
int ret;
void delay(void)
{
Registers.CX.W = 1; /* 10ms */
callint(0xFD);
}
/* 指定番号のコマンドが設定されている? */
if (num < 0 || num > excmd_num)
return FALSE;
ep = &excmd[num];
strcpy(param+1, ep->param);
param[0] = strlen(param+1);
/* 外部プロセス起動準備(キーボード設定、画面クリア) */
kb_asign_push();
KAN_end();
EGB_displayPage(gwork, 0, 0);
MOS_disp(MOS_OFF);
cls(0, 0);
cls(1, 0);
EGB_resolution(gwork, 0, 1);
EGB_resolution(gwork, 1, 1);
EGB_clearScreen(gwork);
SND_fm_timer_a_set(0, 0); /* タイマ割り込み停止 */
SND_fm_timer_b_set(0, 0); /* タイマ割り込み停止 */
SND_fm_timer_b_set(1, 0xDD); /* タイマ割り込み設定 */
EGB_displayPage(gwork, 0, 3);
#if 0
while ((_inb(0x4d8) & 0x80) != 0) ;
_outb(0x4d8, 0x21);
_outb(0x4da, 0x00); delay();
while ((_inb(0x4d8) & 0x80) != 0) ;
_outb(0x4d8, 0x2c);
_outb(0x4da, 0x80); delay();
while ((_inb(0x4d8) & 0x80) != 0) ;
_outb(0x4d8, 0x27); /* clear flag */
_outb(0x4da, 0x30); delay();
while ((_inb(0x4d8) & 0x80) != 0) ;
_outb(0x4d8, 0x26); /* load to timer B */
_outb(0x4da, 0xdd); delay();
while ((_inb(0x4d8) & 0x80) != 0) ;
_outb(0x4d8, 0x27); /* start */
_outb(0x4da, 0x2a);
#endif
/* 起動 */
ret = c_exec(ep->path, param);
errno = 0 ;
SND_fm_timer_a_start(); /* タイマ割り込み再開 */
/* 画面の再初期化、キーボードアサイン復帰 */
init_screen();
KAN_start();
kb_asign_pop();
/*
if (ret != 0)
{
*param = '\0';
_strcats(80, param, "[", ep->path, "] の起動に失敗しました", NULL);
report_fatal_error(ERR_EXEC, param);
}
*/
return TRUE ;
}